/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package s.f.usuarios;

import s.f.jndi.ConexionJNDI;
import s.f.util.AppException;
import s.f.util.Conexion;
import s.f.util.Cripto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Froy
 */
public class CRUD_Usuarios {

    public boolean compareUser(Usuario usuario) {

        return true;
    }

    /**
     *
     * @param usr
     * @param pass
     * @return
     * @throws AppException
     * @deprecated
     */
    public static boolean compareUser(String usr, String pass) throws SQLException, AppException {
        Cripto cripto = new Cripto();
        cripto.setAlgoritmo(Cripto.Algoritmo.MD5);
        
        boolean val = false;
        //Connection con = ConexionJNDI.getConnection();
        Connection con = ConexionJNDI.getConnection();
        PreparedStatement ps = con.prepareStatement(
                "select * from sf_user where email = ? and pass = ?");
        ps.setString(1, usr);
        ps.setString(2, cripto.generateHash(pass));
        ResultSet rs = ps.executeQuery();
        val = rs.next();
        Conexion.closeConnection(con);
        return val;
    }
    
    /**
     * Elimina un usuario por EMAIL.
     *
     */
    public static void deleteUsuario(String email) throws AppException {
        try {
            Connection con = ConexionJNDI.getConnection();
            PreparedStatement ps = con.prepareStatement(
                    "delete from sf_user where email = ?");
            ps.setString(1, email);
            ps.executeUpdate();
            Conexion.closeConnection(con);
        } catch (SQLException sqle) {
            throw new AppException("Fallo al eliminar el empleado", sqle);
        }
    }

    /**
     * Regresa una collección de todos los empleados existentes.
     *
     * @return Regresa una collección de todos los empleados existentes
     * @throws AppException
     */
    public static Collection selectUsuario() throws AppException {
        ArrayList<Map> mapaSelect = new ArrayList<Map>();
        StringBuilder sbQuery = new StringBuilder();
        sbQuery.append("select rid,email,fingreso from sf_user");

        try {
            Connection con = ConexionJNDI.getConnection();
            PreparedStatement ps = con.prepareStatement(sbQuery.toString());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Map m = new HashMap();
                m.put("RID", rs.getInt("rid"));
                m.put("EMAIL", rs.getString("email"));
                m.put("FINGRESO", rs.getString("fingreso"));
                mapaSelect.add(m);
            }
            Conexion.closeConnection(con);
        } catch (SQLException sqle) {
            throw new AppException("Fallo al recuperar la lista "
                    + "de todos los usuarios", sqle);
        }
        return mapaSelect;
    }

    /**
     * Realiza una inserción de un Empleado.
     *
     * @param empleados Solicita un objeto Empleado.
     * @throws AppException
     */
    public static void insertUsuario(Usuarios usuarios) throws AppException {
        Cripto cripto = new Cripto();
        cripto.setAlgoritmo(Cripto.Algoritmo.MD5);
        
        int index = 1;
        
        StringBuilder sb = new StringBuilder();
        sb.append("insert into sf_user ");
        sb.append("(email,pass,fingreso)");
        sb.append("values (?,?,CURRENT_DATE)");
        
        try {
            Connection con = ConexionJNDI.getConnection();
            PreparedStatement ps = con.prepareStatement(sb.toString());

            ps.setString(index++, usuarios.getEmail().trim());
            ps.setString(index++, cripto.generateHash(usuarios.getPass().trim()));

            ps.executeUpdate();

            Conexion.closeConnection(con);
        } catch (SQLException sqle) {
            throw new AppException("Fallo al tratar "
                    + "de insertar los datos los datos del usuario.", sqle);
        }
    }

    /**
     * Obtener si el existen duplicados del usuario.
     *
     * @param email Solicitud del nombre del usuario.
     * @return Regresa true si encuentra datos dublicados en otro caso false.
     * @throws AppException
     */
    public static boolean getDuplicadosByEmail(String email) throws AppException {
        boolean evaluarDuplicado = false;

        String query = "select * from sf_user where email=?";

        try {
            Connection con = ConexionJNDI.getConnection();
            PreparedStatement ps = con.prepareStatement(query);
            ps.setString(1, email);
            ResultSet rs = ps.executeQuery();
            evaluarDuplicado = rs.next();
            Conexion.closeConnection(con);

        } catch (SQLException sqle) {
            throw new AppException("Fallo al tratar de obtener "
                    + "los datos duplicados del usuario.", sqle);
        }
        return evaluarDuplicado;
    }
}
